package com.zkh.myutils.net.mail;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.zkh.myutils.code.CoderUtils;
import com.zkh.myutils.utils.ArrayUtils;

/**
 * 邮件Bean
 * @author zkh
 */
public class MailBean {
	//收件人
	private List<String> receiverList = new ArrayList<>();
	//抄送
	private List<String> ccList = new ArrayList<>();
	//密送
	private List<String> bccList = new ArrayList<>();
	//主题
	private String subject;
	//正文
	private StringBuilder content;
	//正文内嵌资源
	private Map<String, MailSource> inlineSourceMap = new HashMap<>();
	
	/**
	 * 正文类型。1：纯文本，2：HTML
	 */
	private int contentType;
	//附件列表
	private List<File> attachList = new ArrayList<>();
	//附件列表
	private List<MailSource> attachStreamList = new ArrayList<>();
	
	public MailBean() {}
	
	/**
	 * 构造方法
	 * @param to 接收人邮箱
	 */
	public MailBean(String to) {
		this(to, null);
	}
	
	/**
	 * 构造方法
	 * @param to 接收人邮箱
	 * @param subject 主题
	 */
	public MailBean(String to, String subject) {
		this.receiverList.add(to);
		this.subject = subject;
	}
	
	/**
	 * 获取主题
	 */
	public String getSubject() {
		return subject;
	}

	/**
	 * 设置主题
	 * @param subject 主题
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * 获取正文内容
	 */
	public StringBuilder getContent() {
		return content;
	}
	
	/**
	 * 设置纯文本正文内容
	 * @param content 正文内容
	 */
	public StringBuilder setTextContent(String content) {
		//标记为纯文本
		this.contentType = 1;
		//设置内容
		return this.content = new StringBuilder(content==null ? "" : content);
	}

	/**
	 * 设置HTML正文内容
	 * @param htmlString HTML正文内容
	 */
	public StringBuilder setHtmlContent(String htmlString) {
		//标记为HTML
		this.contentType = 2;
		//设置内容
		return this.content = new StringBuilder(htmlString==null ? "" : htmlString);
	}
	
	/**
	 * 添加Html资源
	 * @param inputStream 资源流
	 * @param contentId 资源唯一标识
	 */
	public void addHtmlSource(InputStream inputStream, String contentId) {
		addHtmlSource(inputStream, contentId, "application/octet-stream");
	}
	/**
	 * 添加Html资源
	 * @param inputStream 资源流
	 * @param contentId 资源唯一标识
	 * @param contentType 资源类型。若不指定该参数，将默认为application/octet-stream
	 */
	public void addHtmlSource(InputStream inputStream, String contentId, String contentType) {
		//保存
		inlineSourceMap.put(contentId, new MailSource(inputStream, contentId, contentType));
	}
	
	/**
	 * 获取邮件内嵌资源
	 */
	Map<String, MailSource> getInlineSourceMap() {
		return inlineSourceMap;
	}

	/**
	 * 添加收件人
	 * @param receivers 接收人
	 */
	public void addReceiver(String... receivers) {
		//添加收件人
		ArrayUtils.forEach(receivers, (r, i)->receiverList.add(r));
	}

	/**
	 * 添加抄送人
	 * @param ccs 抄送人
	 */
	public void addCcAddress(String... ccs) {
		//添加抄送人
		ArrayUtils.forEach(ccs, (cc, i)->ccList.add(cc));
	}

	/**
	 * 添加密送人
	 * @param bccs 密送人
	 */
	public void addBccAddress(String... bccs) {
		//添加密送人
		ArrayUtils.forEach(bccs, (bcc, i)->bccList.add(bcc));
	}
	
	/**
	 * 添加附件
	 * @param attachs 附件
	 */
	public void addAttach(File... attachs) {
		//添加附件
		ArrayUtils.forEach(attachs, (attach, i)->attachList.add(attach));
	}
	
	/**
	 * 添加流附件
	 * @param inputStream 附件流
	 * @param filename 附件名称（含后缀）
	 */
	public void addAttach(InputStream inputStream, String filename) {
		attachStreamList.add(new MailSource(inputStream, filename));
	}

	/**
	 * 获取接收人列表
	 */
	public List<String> getReceiverList() {
		return receiverList;
	}

	/**
	 * 获取抄送列表
	 */
	public List<String> getCcList() {
		return ccList;
	}

	/**
	 * 获取密送列表
	 */
	public List<String> getBccList() {
		return bccList;
	}

	/**
	 * 获取附件列表
	 */
	public List<File> getAttachList() {
		return attachList;
	}
	
	/**
	 * 获取附件流列表
	 */
	public List<MailSource> getAttachStreamList(){
		return attachStreamList;
	}
	
	/**
	 * 获取实际收件人，用来作为发送命令参数
	 */
	String[] getReceivers() {
		//总长度
		int len = receiverList.size() + ccList.size() + bccList.size();
		//所有收件人
		List<String> list = new ArrayList<>(receiverList);
		//抄送、密送
		list.addAll(ccList);list.addAll(bccList);
		//返回最终值
		return list.toArray(new String[len]);
	}
	
	/**
	 * 获取主题内容
	 */
	String getSubjectContent() {
		return "SUBJECT: =?UTF-8?B?" + CoderUtils.encodeBase64(subject) + "?=";
	}
	
	/**
	 * 获取收件人内容
	 */
	String getReceiverContent() {
		return "TO: " + receiverList.stream().map(r->"<" + r + ">").collect(Collectors.joining(", "));
	}
	
	/**
	 * 获取抄送人内容
	 */
	String getCcContent() {
		//为空
		if(ccList.isEmpty()) {
			return "";
		}
		return "Cc: " + ccList.stream().map(r->"<" + r + ">").collect(Collectors.joining(", "));
	}
	
	/**
	 * 获取密送人内容
	 */
	String getBccContent() {
		//为空
		if(bccList.isEmpty()) {
			return "";
		}
		return "Bcc: " + bccList.stream().map(r->"<" + r + ">").collect(Collectors.joining(", "));
	}
	
	/**
	 * 正文是否是纯文本
	 */
	boolean isText() {
		return this.contentType==1;
	}
}
